package eightDataType;
/**
* @author jie
* @version 创建时间：2017年11月19日 下午4:05:07
* 类说明
 *
 * todo 注：（1）当char型字符参与计算时，均会将char型数据准换成int型。
 *  转换原则 从低精度向高精度转换
 *
 * todo 注：（2）当 int 与 long 计算时，均会将  int 型数据准换成 long 型。
 *
 * 2个字节数据，16位，0-65535 基础类型
 * char类型是可以运算的因为char在ASCII等字符编码表中，有对应的数值。
 * 在JAVA中，对char类型字符运行时，直接当做ASCII表对应的整数来对待。
*/
public class CharDemo {
	public static void main(String[] args) {
		checkIsValid();
		checkIsValidProxy();
		String smileyEmoji = "\uD83D\uDE00";
		char smileyFirstChar = '\uD83D';//不是一个有效的 unicode.

		System.out.println("CharDemo:main:smileyFirstChar int:"+((int)smileyFirstChar));//55357
		System.out.println("CharDemo:main:smileyFirstChar isSurrogate:"+(Character.isSurrogate(smileyFirstChar)));//
		System.out.println("CharDemo:main:smileyFirstChar :"+(smileyFirstChar));//55357
		System.out.println("CharDemo:main:smileyFirstChar :"+((char)55357));//55357
		System.out.println("CharDemo:main:smileyFirstChar 55357==smileyFirstChar:"+(55357==smileyFirstChar));//true
		System.out.println("CharDemo:main:"+smileyEmoji);//打印 😀
		System.out.println("CharDemo:main:smileyEmoji.length():"+smileyEmoji.length());//2
		System.out.println("CharDemo:main:smileyEmoji.codePointCount():"+smileyEmoji.codePointCount(0,smileyEmoji.length()));//1
		//请注意，这个字符（\uD83D）本身不是一个有效的 Unicode 字符，而是一个 UTF-16 编码的代理对中的高代理（high surrogate）。
		// 当与低代理（low surrogate）（例如，\uDE00）一起使用时，它表示一个有效的 Unicode 扩展平面字符（如笑脸 emoji）。

		char[] chars = smileyEmoji.toCharArray();
		for (int i = 0; i < chars.length; i++) {
			System.out.println("CharDemo:main:"+i+":"+chars[i]);
			//结果：
			//CharDemo:main:0:?
			//CharDemo:main:1:?
		}

		System.out.println("CharDemo:main:"+((int)chars[0]));
		System.out.println("CharDemo:main:"+((int)chars[0]));
		//这个字符（\uD83D）本身不是一个有效的 Unicode 字符
		System.out.println("CharDemo:main:'?'==chars[0]"+('?'==chars[0]));//false
		System.out.println("CharDemo:main:'?'==chars[1]"+('?'==chars[1]));//false
		System.out.println("CharDemo:main:'\uD83D'==chars[1]"+('\uD83D'==chars[1]));//false
		System.out.println("CharDemo:main:'\uD83D'==chars[1]"+('\uD83D'==chars[1]));//false




		char chaa=97;
		System.out.println("cha 97 print= "+chaa);

		System.out.println("char + int 再转char "+(char)(chaa+1));

		char[] temp = "a".toCharArray();
		System.out.println("a char "+"a".toCharArray()[0]);
		System.out.println("a char -97 = "+("a".toCharArray()[0]-97));

		System.out.println(Integer.MAX_VALUE);
		System.out.println(Long.MAX_VALUE - Integer.MAX_VALUE);
	}

	//以下是一个示例，展示如何在 Java 中处理代理字符：
	private static void checkIsValidProxy() {
		System.out.println("CharDemo:checkIsValidProxy:以下是一个示例，展示如何在 Java 中处理代理字符：");
		char highSurrogate = '\uD83D';
		char lowSurrogate = '\uDE00';

		// 检查字符是否是代理对的一部分
		if (Character.isHighSurrogate(highSurrogate) && Character.isLowSurrogate(lowSurrogate)) {
			//走这里
			// 使用 Character.toCodePoint() 将代理对转换为整数（即 Unicode 码点）
			int codePoint = Character.toCodePoint(highSurrogate, lowSurrogate);
			System.out.println("Code point: " + codePoint);//128512

			// 对于基本多文种平面之外的字符，可以使用 Character.charCount() 检查需要多少个 char 来表示
			int charCount = Character.charCount(codePoint);
			System.out.println("Char count: " + charCount);//2

			// 您可以使用 Character.isSupplementaryCodePoint() 检查 Unicode 码点是否属于补充字符
			boolean isSupplementary = Character.isSupplementaryCodePoint(codePoint);
			System.out.println("Is supplementary: " + isSupplementary);
		} else {
			System.out.println("Invalid surrogate pair");
		}

	}

	//以下是一个示例，展示如何检查 char 是否表示一个有效的 Unicode 字符：
	private static void checkIsValid() {
		System.out.println("CharDemo:checkIsValid:以下是一个示例，展示如何检查 char 是否表示一个有效的 Unicode 字符：");
		char ch = '\uD83D'; // 高代理（high surrogate）
		//检查字符是否是一个有效的 Unicode 字符（不是代理）
		if (!Character.isSurrogate(ch)) {
			int codePoint = (int) ch;
			if (Character.isValidCodePoint(codePoint)) {
				System.out.println("Valid Unicode character: " + ch);
			} else {
				System.out.println("Invalid Unicode character: " + ch);
			}
		} else {//是代理
			System.out.println("是代理字符：Surrogate character: " + ch);//走这里。。。。
		}
	}



}
